package peace.gui.controls.navigation
{
import flash.display.InteractiveObject;
import flash.display.SimpleButton;
import flash.display.Sprite;
import flash.events.MouseEvent;

import peace.gui.controls.NavigationEvent;
import peace.gui.layout.Container;
import peace.gui.layout.RowLayout;

	
[Event(name="move", type="peace.gui.controls.NavigationEvent")]

/**
* Pager считает индекс (_selected) с нуля.
*/
public class Pager extends Sprite
{
	protected var back:InteractiveObject;
	protected var next:InteractiveObject;
	
	//индекс последнего шага (число шагов минус один или 0)
	protected var maxStep:int;
	/**
	* В начале выделен первый шаг
	*/	
	protected var _selected:int=0;
	
	protected var container:Container = new Container(new RowLayout());
	
	public function Pager (	back:InteractiveObject, next:InteractiveObject, 
							maxStep:uint=99)
	{
		this.back = back;
		this.next = next;
		length = maxStep;
		
		initContent();
		selected = 0;
	}
	
	protected function initContent():void
	{
		build ();
		
		if(back)
		{
			back.addEventListener(MouseEvent.CLICK, onBack, false, 0, true);
		}
		
		if(next)
		{
			next.addEventListener(MouseEvent.CLICK, onNext, false, 0, true);
		}
	}
	/**
	 * ПереЕсли собираем пейджер из дополнительных элементов
	 */	
	protected function build ():void
	{
		addChild(container);
		container.add(back);
		container.add(next);
		container.arrange();
	}
	
	protected function checkButtons():void
	{
		backEnabled = _selected > 0;
		nextEnabled = _selected < maxStep;
	}
	
	public function set selected (index:uint):void
	{
		setSelected(index, false);
	}
	
	protected function setSelected(index:int, needEvent:Boolean):void
	{
		var old:int = _selected;
		_selected = index;
		
		checkButtons();
		
		if (index != old && needEvent)
		{
			dispatchEvent(new NavigationEvent(NavigationEvent.MOVE, _selected, old));
		}
	}

	/**
	 * Вынесено в отдельный метод, чтобы иметь возможность изменить функциональность - 
	 * например, не менять индекс, а кидать событие о навигации.
	 * @param index
	 * 
	 */
	protected function navigateTo(index:uint):void
	{
		setSelected(index, true);
	}
	
	public function get selected ():uint
	{
		return _selected;
	}
	
	protected function onBack (e:MouseEvent):void
	{
		if (_selected > 0)
		{
			navigateTo(selected - 1);
		}
	} 
	
	protected function onNext (e:MouseEvent):void
	{
		if (_selected < maxStep)
		{
			navigateTo(selected + 1);
		}
	}
	
	public function set backEnabled (b:Boolean):void
	{
		if(!back)
		{
			return;
		}

		back.mouseEnabled = b;
		if (back is SimpleButton)
		{
			SimpleButton(back).enabled = b;
		}
	}
	public function get backEnabled ():Boolean
	{
		return back ? back.mouseEnabled : false;
	}
	
	public function set nextEnabled (b:Boolean):void
	{
		if(!next)
		{
			return;
		}
		
		next.mouseEnabled = b;
		if (next is SimpleButton)
		{
			SimpleButton(next).enabled = b;
		}
	}
	public function get nextEnabled ():Boolean
	{
		return next ? next.mouseEnabled : false;
	}
	
	/**
	 * Число страниц, равное числу шагов. 
	 * !НЕ ИНДЕКС ПОСЛЕДНЕЙ СТРАНИЦЫ!
	 */	
	public function get length ():uint
	{
		return maxStep==0 ? 0 : maxStep+1;
	}
	
	public function set length (n:uint):void
	{
		maxStep = Math.max(n-1, 0);
		checkButtons();
		if (maxStep <= selected)
		{
			setSelected(maxStep, false);	
		}
	}
	
}

}